package es.gesfutbol.util;

import java.util.ArrayList;
import java.util.Set;

import org.hibernate.proxy.HibernateProxy;

public class HibernateHelper
{
    /**
     * Funció que retorna un objecte POJO "pur" sense el proxy d'hibernate:
     *
     * deproxy(a, A.class);
     *
     * @param <T> El tipus de lobjecte a retornar
     * @param maybeProxy Objecte que suposadament és un proxy
     * @param baseClass Classe de entitat a la que volem convertir objecte
     * @return Copia de l'objecte proxy, pero com a instància de la classe
     * original (sense proxy)
     * @throws ClassCastException
     */
    @SuppressWarnings({
            "rawtypes", "unchecked"
    })
    public static <T> T deproxy(final Object maybeProxy, final Class<T> baseClass) throws ClassCastException
    {
        T obj;
        if(maybeProxy instanceof HibernateProxy)
        {
            obj = baseClass.cast(((HibernateProxy) maybeProxy).getHibernateLazyInitializer().getImplementation());
        }
        else
        {
            obj = baseClass.cast(maybeProxy);
        }

        if(obj instanceof ArrayList)
        {
            final ArrayList list = (ArrayList) obj;
            for(int i = 0; i < list.size(); i++)
            {
                list.set(i, HibernateHelper.deproxy(list.get(i), Object.class));
            }
        }

        if(obj instanceof Set)
        {
            final ArrayList list = new ArrayList<Object>((Set) obj);
            for(int i = 0; i < list.size(); i++)
            {
                list.set(i, HibernateHelper.deproxy(list.get(i), Object.class));
            }
        }

        return obj;
    }
}
